#include<string.h>
#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

#define NUM 10
typedef void (*func_t)();//函数指针-void 是函数返回类型，fun_t是函数名，没有参数

func_t handerTask[NUM];

void task1()
{
  printf("hander task1\n");
}
void task2()
{
  printf("hander task2\n");
}
void task3()
{
  printf("hander task3\n");
}
void loadTask()
{
  memset(handerTask,0,sizeof(handerTask));
  handerTask[0]=task1;
  handerTask[1]=task2;
  handerTask[2]=task3;
}
int main()
{
 pid_t id=fork();
assert(id!=-1);
if(id==0)
{
//子进程
int num=3;
while(num)
{
  printf("child running,pid: %d ,ppid: %d ,num: %d\n",getpid(),getppid(),num--);
  sleep(3);
}
exit(10);
}
//父进程
loadTask();
int status=0;
while(1)
{
  pid_t ret=waitpid(id,&status,WNOHANG);//WHOHANG:非阻塞->子进程没有退出，父进程检测时候，立即返回
  if(ret==0)
  {
    //waitpid调用成功，子进程没有退出
  printf("wait done,but child is running...\n");  
 for(int i=0;handerTask[i]!=NULL;i++)
 {
   handerTask[i]();//采用回调的方式，执行我们想让父进程在非阻塞等待时做的事情。
 }
  
  
  
  }
  else if(ret>0)
  {
    //waitpid调用成功，子进程退出了
    printf("wait success,exit code: %d,sig: %d\n",(status>>8)&0xFF,status&0x7F);
    break;
  }
  else{
    //waitpid调用失败
    printf("waitpid call failed!\n");
    break;
  }
  sleep(1);
}
//  int status=0;
//  int ret=waitpid(id,&status,0);
//  if(ret>0)
//{
//  //判断子进程是否正常退出
//  if(WIFEXITED(status))//子进程正常退出
//  {//判断子进程运行的结果
//    printf("exit code: %d\n",WEXITSTATUS(status));
//  }else 
//  {
//    //子进程异常终止
//    printf("child exit abnormally!\n ");
//  }
////  printf("wait success,exit code: %d, sig: %d\n",(status>>8)&0xFF,status&0x7F);
//}
return 0;
}
